package com.luxsoft.siipap.em.replica.ui.dashboard;



import java.util.Date;
import java.util.List;

import javax.swing.SwingWorker;

import org.jfree.data.general.DefaultValueDataset;
import org.jfree.data.general.ValueDataset;

import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;

import com.jgoodies.binding.PresentationModel;
import com.jgoodies.binding.value.ValueHolder;
import com.jgoodies.binding.value.ValueModel;
import com.luxsoft.siipap.em.replica.dao.SWVentasDao;
import com.luxsoft.siipap.em.replica.dao.SiipapVentasDao;
import com.luxsoft.siipap.model.Periodo;
import com.luxsoft.siipap.service.ServiceLocator2;

/**
 * Presentation model para la UI del dashboard de monitoreo de ventas
 * Siipap Vs SWEX 
 * 
 * @author Ruben Cancino
 *
 */
public class VentasAgentModel extends PresentationModel{
	
	private SiipapVentasDao siipapVentasDao;
	private SWVentasDao swVentasDao;
	
	
	private DefaultValueDataset registrosDataSet;
	private DefaultValueDataset importesDataSet;

	public VentasAgentModel() {
		super(new MedidorDeVentas());
		init();
		initEventHandling();
	}
	
	protected void init(){
		siipapVentasDao=new SiipapVentasDao();
		swVentasDao=new SWVentasDao(ServiceLocator2.getAnalisisJdbcTemplate());
		registrosDataSet=new DefaultValueDataset(0);
		importesDataSet=new DefaultValueDataset(0);
	}
	
	private void initEventHandling(){
		//addPropertyChangeListener(new ChangeHandler());
	}
	
	public MedidorDeVentas getMedidor(){
		return (MedidorDeVentas)getBean();
	}
	
	public void actualizar(){
		actualizar(getMedidor());
	}
	
	public void actualizar(MedidorDeVentas medidor){
		medidor.setRegistrosSiipap(getSiipapVentasDao().buscarRegistrosVentas(medidor.getPeriodo()));
		medidor.setRegistrosSW(getSwVentasDao().buscarRegistrosVentas(medidor.getPeriodo()));
		medidor.setImporteSiipap(getSiipapVentasDao().buscarImporteDeVentas(medidor.getPeriodo()));
		medidor.setImporteSW(getSwVentasDao().buscarImporteDeVentas(medidor.getPeriodo()));
		medidor.setLastUpdate(new Date());
	}
	
	public void actualizarDataSets(){
		double dif=getMedidor().getDiferenciaRegistros();
		registrosDataSet.setValue(dif);
		importesDataSet.setValue(getMedidor().getDiferenciaImportes());
		diferenciaImporte.setValue(getMedidor().getDifEnImportes());
		diferenciaRegistros.setValue(getMedidor().getDifEnRegistros());
	}

	public SiipapVentasDao getSiipapVentasDao() {
		return siipapVentasDao;
	}

	public void setSiipapVentasDao(SiipapVentasDao siipapVentasDao) {
		this.siipapVentasDao = siipapVentasDao;
	}

	public SWVentasDao getSwVentasDao() {
		return swVentasDao;
	}

	public void setSwVentasDao(SWVentasDao swVentasDao) {
		this.swVentasDao = swVentasDao;
	}
	
	public DefaultValueDataset getImportesDataSet() {
		return importesDataSet;
	}

	public ValueDataset getRegistrosDataSet() {
		return registrosDataSet;
	}
	
	private ValueModel diferenciaImporte=new ValueHolder(new Double(0));
	private ValueModel diferenciaRegistros=new ValueHolder(new Integer(0));
	
	public ValueModel getDiferenciaImporte() {
		return diferenciaImporte;
	}

	public ValueModel getDiferenciaRegistros() {
		return diferenciaRegistros;
	}

	private EventList<MedidorDeVentas> medidas;
	
	public EventList<MedidorDeVentas> getMedidas(){
		if(medidas==null){
			medidas=new BasicEventList<MedidorDeVentas>();
		}
		return medidas;
	}
	
	public void buscarDiferencias(){
		medidas.clear();
		SwingWorker<String, MedidorDeVentas> worker=new SwingWorker<String, MedidorDeVentas>(){
			@Override
			protected String doInBackground() throws Exception {
				Periodo p=getMedidor().getPeriodo();
				List<Date> dias=p.getListaDeDias();
				for(Date d:dias){
					MedidorDeVentas m=new MedidorDeVentas();
					m.setPeriodo(new Periodo(d));
					m.setLastUpdate(new Date());
					actualizar(m);
					publish(m);
				}
				return "OK";
			}
			@Override
			protected void process(List<MedidorDeVentas> chunks) {
				for(MedidorDeVentas m:chunks){
					medidas.add(m);
				}
			}			
		};
		worker.execute();
		
	}

	public static void main(String[] args) {		
		VentasAgentModel model=new VentasAgentModel();
		model.getMedidor().setPeriodo(Periodo.getPeriodoEnUnMes(9));
		model.actualizar();
		System.out.println(model.getBean());
	}

}
